package restaurant.service.impl;

import java.io.File;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import restaurant.dao.FoodDao;
import restaurant.dao.impl.FoodDaoImpl;
import restaurant.pojo.DivPage;
import restaurant.pojo.Foods;
import restaurant.pojo.FoodsType;
import restaurant.service.FoodService;

public class FoodServiceImpl implements FoodService {
	private FoodDao dao = new FoodDaoImpl();
	@Override
	public int addFood(HttpServletRequest req) throws SQLException {
		int result;
		Foods food = new Foods();
		DiskFileItemFactory disk = new DiskFileItemFactory();
		disk.setSizeThreshold(1024 * 1024 * 5);
		String path = "D:\\restaurant";
		File repository = new File(path);
		disk.setRepository(repository);

		ServletFileUpload fu = new ServletFileUpload(disk);
		try {
			// 解析请求，目的和getparamter差不多
			List<FileItem> fileItem = fu.parseRequest(req);
//			System.out.println(fileItem.size());
			// FileItem并不是只保存文件，所有表单中的只要带有name属性的标签都会将数据保存到一个FileItem中

			// 名称，分类，简介等所有的数据全部在fileItem集合中，我们需要挨个读取出来并且保存到数据库

			for (FileItem item : fileItem) {

				if (item.isFormField()) {
					// 当做文本内容进行读取

					// getFieldName是获取input name属性的值
					String fieldName = item.getFieldName();
					// getString是获取value的值
					String value = item.getString("utf-8");
//					System.out.println(fieldName);
//					System.out.println(value);

					// setProperty 用于为对象的某一个属性赋值
					// 第一个参数是对象，第二个参数是属性的名字，第三个参数是属性的值
					// 需要保证前端inputname的名字要和对象的属性的名字一一对象
					BeanUtils.setProperty(food, fieldName, value);

				} else {
					// 写入到本地

					// 为了保证文件名不会重复，我们这里使用uuid为文件名字进行命名

					// 写入本地的哪一个位置？
					// 1写如到当前项目部署到tomcat后的路径上（也就是保存到tomcat的webapp下的文件夹下）
					// req.getRealPath("")可以得到部署到tomcat上之后的真实目录。

					// 2使用tomcat虚拟路径

					String uuid = UUID.randomUUID().toString().replace("-", "");
					String imgname = uuid + item.getName();
					String imgUrl = path + "/" + imgname;
					item.write(new File(imgUrl));

					food.setImgurl(imgname);
				}

			}
			// 这里是try代码块的最后一行，执行到这一行证明没有遇到异常，也就是所有的数据保存到本地文件成功

			result = dao.addFood(food);
		} catch (Exception e) {

			e.printStackTrace();
			result = 0;
		}
		return result;
	}

	@Override
	public List<FoodsType> getAllType() throws SQLException {

		return dao.getAllType();
	}

	@Override
	public DivPage<Foods> showFood(String pageNum, String pageSize) throws SQLException {
		int pagenum;
		if (pageNum == null || "".equals(pageNum)) {
			pagenum = 1;
		} else {
			pagenum = Integer.valueOf(pageNum);
		}
		int pagesize;
		if (pageSize == null || "".equals(pageSize)) {
			pagesize = 5;
		} else {
			pagesize = Integer.valueOf(pageSize);
		}
		long pageCount;
		long count = dao.getCount();
		if (count % pagesize == 0) {
			pageCount = count / pagesize;
		} else {
			pageCount = count / pagesize + 1;
		}
		int offset = (pagenum - 1) * pagesize;
		List<Foods> foods = dao.showFood(offset, pagesize);
		DivPage<Foods> divPage = new DivPage<Foods>();
		divPage.setDatas(foods);
		divPage.setPageNum(pagenum);
		divPage.setPageCount((int) pageCount);
		return divPage;
	}

	@Override
	public int deleFood(String id) throws SQLException {
		
		return dao.deleFood(id);
	}

	@Override
	public int updateFood(HttpServletRequest req) throws SQLException {
		
		int result;
		Foods food = new Foods();
		DiskFileItemFactory disk = new DiskFileItemFactory();
		disk.setSizeThreshold(1024 * 1024 * 5);
		String path = "D:\\restaurant";
		File repository = new File(path);
		disk.setRepository(repository);

		ServletFileUpload fu = new ServletFileUpload(disk);
		try {
			// 解析请求，目的和getparamter差不多
			List<FileItem> fileItem = fu.parseRequest(req);
//			System.out.println(fileItem.size());
			// FileItem并不是只保存文件，所有表单中的只要带有name属性的标签都会将数据保存到一个FileItem中

			// 名称，分类，简介等所有的数据全部在fileItem集合中，我们需要挨个读取出来并且保存到数据库

			for (FileItem item : fileItem) {

				if (item.isFormField()) {
					// 当做文本内容进行读取

					// getFieldName是获取input name属性的值
					String fieldName = item.getFieldName();
					// getString是获取value的值
					String value = item.getString("utf-8");
//					System.out.println(fieldName);
//					System.out.println(value);

					// setProperty 用于为对象的某一个属性赋值
					// 第一个参数是对象，第二个参数是属性的名字，第三个参数是属性的值
					// 需要保证前端inputname的名字要和对象的属性的名字一一对象
					BeanUtils.setProperty(food, fieldName, value);

				} else {
					// 写入到本地

					// 为了保证文件名不会重复，我们这里使用uuid为文件名字进行命名

					// 写入本地的哪一个位置？
					// 1写如到当前项目部署到tomcat后的路径上（也就是保存到tomcat的webapp下的文件夹下）
					// req.getRealPath("")可以得到部署到tomcat上之后的真实目录。

					// 2使用tomcat虚拟路径

					String uuid = UUID.randomUUID().toString().replace("-", "");
					String imgname = uuid + item.getName();
					String imgUrl = path + "/" + imgname;
					item.write(new File(imgUrl));

					food.setImgurl(imgname);
				}

			}
			// 这里是try代码块的最后一行，执行到这一行证明没有遇到异常，也就是所有的数据保存到本地文件成功

			result = dao.updateFood(food);
		} catch (Exception e) {

			e.printStackTrace();
			result = 0;
		}
		return result;
	}

	@Override
	public List<Foods> findFood(String param) throws SQLException {
		List<Foods> find = dao.find(param);
		
		return find;
	}

}
